/*
*    Phantom v2.0 GUI Automation Software
*    Copyright (C) 2009  John C. Van Arsdall (john@phantomtest.com)
*
*    This program is free software; you can redistribute it and/or modify
*    it under the terms of the GNU General Public License as published by
*    the Free Software Foundation; either version 2 of the License, or
*    (at your option) any later version.
*
*    This program is distributed in the hope that it will be useful,
*    but WITHOUT ANY WARRANTY; without even the implied warranty of
*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*    GNU General Public License for more details.
*
*    You should have received a copy of the GNU General Public License along
*    with this program; if not, write to the Free Software Foundation, Inc.,
*    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
*/
#include ".\dataptd.h"
#include ".\ssi_dataptdoutput.h"

/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////

SSI_INT64 CDataPTD::sType = 0;

jmethodID CDataPTD::getOutputID = 0;
jmethodID CDataPTD::testMessage = 0;
JNIEnv* CDataPTD::env = 0;
jobject CDataPTD::my_obj = 0;
jclass CDataPTD::my_class = 0;

/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////

CDataPTD::CDataPTD(void)
{
  if(!sType){
		sType = 1;
		sType = Factory_RegisterData((CData*)new CDataPTD());
	}
	Type = sType;
	DataName = "ptd";
}

/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////

CDataPTD::~CDataPTD(void)
{
}

/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////

SSI_BOOL CDataPTD::CopyData(CData* Other)
{
  CDataPTD* O = (CDataPTD*)Other;
  my_obj = O->my_obj;
  return 1;
}

/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////

CData* CDataPTD::MakeData(void)
{
	return (CData*) new CDataPTD();
}

/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////

SSI_BOOL CDataPTD::DeleteData(CData* In)
{
	delete ((CDataPTD*)In);
	return 1;
}

/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////

SSI_BOOL CDataPTD::DataFromString(const String& sData)
{
	return 0;
}

/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////

String CDataPTD::GetString(void)
{
	String Ret = "PTD";
	return Ret;
}

/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////

SSI_INT64 CDataPTD::SizeOf(void)
{
	return 0;
}

/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////

SSI_INT64 CDataPTD::GetRegisteredType(void)
{
	return sType;
}

/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////

CStatus CDataPTD::InitData(void)
{
	CFunctionDecl aNewFunc;
  
  aNewFunc.Name = "getOutput";
  aNewFunc.ReturnType = CDataPTDOutput::GetRegisteredType();
	aNewFunc.SetProcessor(this);
	AddFunction(aNewFunc);

  //aNewFunc.Name = "Save";
  //aNewFunc.ReturnType = CDataBool::GetRegisteredType();
	//aNewFunc.addType(CDataString::GetRegisteredType());
	//aNewFunc.SetProcessor(this);
	//AddFunction(aNewFunc);


	//aNewFunc.Name = "Save";
  //aNewFunc.ReturnType = CDataBool::GetRegisteredType();
	//aNewFunc.addType(CDataString::GetRegisteredType());
	//aNewFunc.SetProcessor(this);
	//AddFunction(aNewFunc);

	//aNewFunc.Clear();
	//aNewFunc.Name = "Load";
	//aNewFunc.ReturnType = CDataBool::GetRegisteredType();
	//aNewFunc.addType(CDataString::GetRegisteredType());
	//aNewFunc.SetProcessor(this);
	//AddFunction(aNewFunc);

////
//	CVariable aVar;
//	aVar.Name = "Tag";
//	aVar.SetType(CDataString::GetRegisteredType());
//	AddVariable(aVar);

//	aVar.Name = "Class";
//	aVar.SetType(CDataString::GetRegisteredType());
//	AddVariable(aVar);

	return STAT_OK;
}

/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////

void CDataPTD::SSI_FunctionProcessor(SSI_FunctionAPI& theAPI)
{
  // Initial Errors
  if(my_obj == 0){
      theAPI.m_ReturnStatus.Format(STAT_ERR, "PTD processor internal error: my_obj");
      return;
  }

  if(env == 0){
      theAPI.m_ReturnStatus.Format(STAT_ERR, "PTD processor internal error: env");
      return;
  }

  if(theAPI.m_FunctionName == "getOutput"){
    if(getOutputID == 0){
      theAPI.m_ReturnStatus.Format(STAT_ERR, "PTD processor internal error: %s", theAPI.m_FunctionName.Str());
      return;
    }

		CDataPTDOutput ret;
    
    // Call the method
    jobject outp = env->CallObjectMethod(my_obj, CDataPTD::getOutputID);
    if(outp == 0){
      theAPI.m_ReturnStatus.Format(STAT_ERR, "PTD processor error: no output available");
      return;
    }
    ret.my_obj = outp;
    theAPI.SetReturnData(&ret);
    theAPI.m_ReturnStatus = STAT_OK;
		return;
  }

  /*
	if(theAPI.m_FunctionName == "Save"){
		CDataString s;
		CDataBool ret;
		s.Data = SSI_EXTRACT(CDataString, 0);
    if(theAPI.m_Engine){
      if(theAPI.m_Engine->Environment){
        String sTemp;
        theAPI.m_ReturnStatus = theAPI.m_Engine->Environment->GetAbsolutePath(s.Data, sTemp);
        if(!theAPI.m_ReturnStatus) return;
        s.Data = sTemp;
      }
    }
		theAPI.m_ReturnStatus = SaveToFile(s.Data);

		return;
	}else if(theAPI.m_FunctionName == "Load"){


		CDataString s;
		CDataBool ret;
		s.Data = SSI_EXTRACT(CDataString, 0);

    if(theAPI.m_Engine){
      if(theAPI.m_Engine->Environment){
        String sTemp;
        theAPI.m_ReturnStatus = theAPI.m_Engine->Environment->GetAbsolutePath(s.Data, sTemp);
        if(!theAPI.m_ReturnStatus) return;
        s.Data = sTemp;
      }
    }

		theAPI.m_ReturnStatus = LoadFromFile(s.Data);

	}
  */
}

/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////

SSI_INT64 CDataPTD::Register(SSI_INT64 NewType){
	sType = NewType;
	return 1;
}

/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////

void CDataPTD::UnRegister(){
	sType = 0;
}
